package io.renren.modules.workflow.service.impl;

import cn.hutool.core.util.StrUtil;
import io.renren.common.utils.AjaxResult;
import io.renren.modules.sys.entity.SysUserEntity;
import io.renren.modules.workflow.dao.ActBusModelDefinitionMapper;
import io.renren.modules.workflow.entity.ActBusModelDefinition;
import io.renren.modules.workflow.entity.BusRoleWorkFlow;
import io.renren.modules.workflow.enums.ActBusDeployStatusEnum;
import io.renren.modules.workflow.service.IActBusModelDefinitionService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * 流程单元数据Service业务层处理
 *
 * @author caiap
 * @date 2021-07-22
 */
@Service
public class ActBusModelDefinitionServiceImpl implements IActBusModelDefinitionService {
    @Autowired
    private ActBusModelDefinitionMapper actBusModelDefinitionMapper;
    @Autowired
    private RepositoryService repositoryService; //流程定义部署

    /**
     * 查询流程模版定义部署
     *
     * @param abmdId 流程模版定义部署ID
     * @return 流程模版定义部署
     */
    @Override
    public ActBusModelDefinition selectActBusModelDefinitionById(String abmdId) {
        return actBusModelDefinitionMapper.selectActBusModelDefinitionById(abmdId);
    }

    /**
     * 查询流程模版定义部署
     *
     * @param abmdDeployId 流程部署ID
     * @return 流程模版定义部署
     */
    @Override
    public ActBusModelDefinition selectActBusModelDefinitionDeployId(String abmdDeployId) {
        return actBusModelDefinitionMapper.selectActBusModelDefinitionDeployId(abmdDeployId);
    }

    /**
     * 查询流程模版定义部署列表
     *
     * @param actBusModelDefinition 流程模版定义部署
     * @return 流程模版定义部署
     */
    @Override
    public List<ActBusModelDefinition> selectActBusModelDefinitionList(ActBusModelDefinition actBusModelDefinition) {
        return actBusModelDefinitionMapper.selectActBusModelDefinitionList(actBusModelDefinition);
    }

    /**
     * 查询流程模版定义部署列表 取消掉部门权限
     *
     * @param actBusModelDefinition 流程模版定义部署
     * @return 流程模版定义部署集合
     */
    @Override
    public List<ActBusModelDefinition> selectActBusModelDefinitionlistStart(ActBusModelDefinition actBusModelDefinition){
        return actBusModelDefinitionMapper.selectActBusModelDefinitionlistStart(actBusModelDefinition);
    }
    /**
     * 新增流程模版定义部署
     *
     * @param actBusModelDefinition 流程模版定义部署
     * @return 结果
     */
    @Override
    public int insertActBusModelDefinition(ActBusModelDefinition actBusModelDefinition) {
        actBusModelDefinition.setAbmdId(UUID.randomUUID().toString());
        actBusModelDefinition.setCreateBy(((SysUserEntity) SecurityUtils.getSubject().getPrincipal()).getUsername());
        actBusModelDefinition.setCreateTime(new Date());
        actBusModelDefinition.setDeptId(((SysUserEntity) SecurityUtils.getSubject().getPrincipal()).getUserId());
        actBusModelDefinition.setUserId(((SysUserEntity) SecurityUtils.getSubject().getPrincipal()).getUserId());
        return actBusModelDefinitionMapper.insertActBusModelDefinition(actBusModelDefinition);
    }

    /**
     * 修改流程模版定义部署
     *
     * @param actBusModelDefinition 流程模版定义部署
     * @return 结果
     */
    @Override
    public int updateActBusModelDefinition(ActBusModelDefinition actBusModelDefinition) {
        actBusModelDefinition.setUpdateBy(((SysUserEntity) SecurityUtils.getSubject().getPrincipal()).getUsername());
        actBusModelDefinition.setUpdateTime(new Date());
        return actBusModelDefinitionMapper.updateActBusModelDefinition(actBusModelDefinition);
    }


    /**
     * 删除流程模版定义部署信息
     *
     * @param abmdId 流程模版定义部署ID
     * @return 结果
     */
    @Override
    public AjaxResult deleteActBusModelDefinitionById(String abmdId) {
        //根据ID获取流程部署情况
        ActBusModelDefinition abmdModel =
                actBusModelDefinitionMapper.selectActBusModelDefinitionById(abmdId);
        if (abmdModel == null) {
            return AjaxResult.error("删除失败:没有找到流程部署资源");
        }
        if (abmdModel.getAbmdDeployStatus().equals(ActBusDeployStatusEnum.YES.getKey())) {
            return AjaxResult.error("删除失败:流程已部署,请取消部署后删除");
        }
        //删除流程
        if (actBusModelDefinitionMapper.deleteActBusModelDefinitionById(abmdId) > 0) {
            return AjaxResult.success("删除成功");
        } else {
            return AjaxResult.success("删除失败");
        }
    }

    /**
     * @Desc: 根据流程模板定义ID部署流程
     * @auther: landlord
     * @date: 2021/7/26 13:23
     * @return:
     */
    @Override
    @Transactional
    public AjaxResult workFlowDeploy(String abmdId) {
        //根据ID获取流程部署XML
        ActBusModelDefinition abmdModel =
                actBusModelDefinitionMapper.selectActBusModelDefinitionById(abmdId);
        if (abmdModel == null) { //增加判断防止伪造id进行请求
            return AjaxResult.error("部署失败:没有找到流程部署资源对象");
        }
        //增加判断防止伪造参数进行请求
        if (abmdModel.getAbmdDeployStatus().equals(ActBusDeployStatusEnum.YES.getKey())) {
            return AjaxResult.error("部署失败:流程已部署，请不要重复操作");
        }
        if (StrUtil.isEmpty(abmdModel.getAbmdXml())) {
            return AjaxResult.error("部署失败:请先进行流程设计");
        }
        //流程部署
        Deployment deployment = repositoryService.
                createDeployment().
                key("WF-" + abmdId).
                name(abmdModel.getAbmdTitle()).
                addString(abmdId + ".bpmn20.xml", abmdModel.getAbmdXml()).
                deploy();
        //获取流程部署ID
        String deployId = deployment.getId();
        //成功后修改流程模板定义部署状态为已部署 需要处理事务
        abmdModel.setAbmdDeployId(deployId);
        abmdModel.setAbmdDeployStatus(ActBusDeployStatusEnum.YES.getKey());
        if (actBusModelDefinitionMapper.updateActBusModelDefinition(abmdModel) > 0) {
            return AjaxResult.success("部署成功");
        } else {
            return AjaxResult.success("部署失败");
        }
    }

    /**
     * 取消角色流程授权
     * @author: pandizhubp 
     * @datetime: 2022/1/13 00138:58
     */
    @Override
    public AjaxResult deleteRoleWorkFlow(ActBusModelDefinition actBusModelDefinition) {
        int result = actBusModelDefinitionMapper.deleteRoleWorkFlow(actBusModelDefinition);
        return result > 0 ? AjaxResult.success("取消流程授权成功") : AjaxResult.error("取消流程授权失败了,请稍后在试");
    }

    /**
     * 批量角色流程授权
     * @author: pandizhubp
     * @datetime: 2022/1/13 00138:58
     */
    @Override
    public AjaxResult batchRoleWorkFlow(ActBusModelDefinition actBusModelDefinition) {
        if (actBusModelDefinition.getWfIds() != null && actBusModelDefinition.getWfIds().length > 0) {
            List<BusRoleWorkFlow> list = new ArrayList<BusRoleWorkFlow>();
            for (String wfId : actBusModelDefinition.getWfIds()) {
                BusRoleWorkFlow rf = new BusRoleWorkFlow();
                rf.setRoleId(actBusModelDefinition.getRoleId());
                rf.setWfIdId(wfId);
                list.add(rf);
            }
            if (list.size() > 0) {
                actBusModelDefinitionMapper.batchRoleWorkFlow(list);
            }
            return AjaxResult.success("流程授权成功");
        }
        return AjaxResult.error("没有需要添加的流程授权");
    }
}
